package com.learn.english.model.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.learn.english.utils.JsonUtils;
import lombok.*;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * @author TISNIW
 * @version 1.0
 * @date 2025/6/21 20:51
 * @desc 菜单信息实体类，用于权限系统中的菜单管理
 */
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("user_menu")
public class UserMenu {

    /**
     * 主键ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     * 父菜单ID，一级菜单为0
     */
    @TableField("parent_id")
    private Integer parentId;

    /**
     * 权限ID（角色ID），用于权限控制
     */
    @TableField("role_id")
    private Integer roleId;

    /**
     * 上次操作用户ID
     */
    @TableField("operator_id")
    private Integer operatorId;

    /**
     * 菜单名称（如：用户管理、仪表盘）
     */
    @TableField("name")
    private String name;

    /**
     * 菜单路径（如：/user/list）
     */
    @TableField("url")
    private String url;

    /**
     * 图标（如：fa fa-user）
     */
    @TableField("icon")
    private String icon;

    /**
     * 页面ID（关联页面表）
     */
    @TableField(typeHandler = JacksonTypeHandler.class, value = "page_id")
    private List<Integer> pageId;

    /**
     * 菜单类型（1=目录, 2=菜单, 3=按钮）
     */
    @TableField("type")
    private Byte type;

    /**
     * 排序号，用于展示顺序
     */
    @TableField("sort")
    private Integer sort;

    /**
     * 状态（0=禁用 1=启用）
     */
    @TableField("status")
    private Byte status;

    /**
     * 创建时间，默认当前时间
     */
    @TableField(value = "created_at", fill = FieldFill.INSERT)
    private LocalDateTime createdAt;

    /**
     * 更新时间，自动更新
     */
    @TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;

    /**
     * 子菜单列表（非数据库字段）
     */
    @TableField(exist = false)
    private List<UserMenu> children = new ArrayList<>();

    /**
     * 是否有子菜单（非数据库字段）
     */
    @TableField(exist = false)
    private Boolean hasChildren = false;

    @Override
    public String toString() {
        return JsonUtils.writeValueAsString(this);
    }
}